<TITLE>Drag and Drop</TITLE>
<FILE>dnd</FILE>
GdkDragContext
+GdkDragCancelReason
gdk_drag_get_selection
gdk_drag_abort
gdk_drop_reply
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GdkDragContextClass, cancel),
NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
+ g_cclosure_marshal_VOID__ENUM,
+ G_TYPE_NONE, 1, GDK_TYPE_DRAG_CANCEL_REASON);
/**
* GdkDragContext::drop-performed:
}
void
-gdk_drag_context_cancel (GdkDragContext *context)
+gdk_drag_context_cancel (GdkDragContext *context,
+ GdkDragCancelReason reason)
{
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
- g_signal_emit (context, signals[CANCEL], 0);
+ g_signal_emit (context, signals[CANCEL], 0, reason);
}
GList *
GDK_ACTION_ASK = 1 << 5
} GdkDragAction;
+/**
+ * GdkDragCancelReason:
+ * @GDK_DRAG_CANCEL_NO_TARGET: There is no suitable drop target.
+ * @GDK_DRAG_CANCEL_USER_CANCELLED: Drag cancelled by the user
+ * @GDK_DRAG_CANCEL_ERROR: Unspecified error.
+ *
+ * Used in #GdkDragContext to the reason of a cancelled DND operation.
+ *
+ * Since: 3.20
+ */
+typedef enum {
+ GDK_DRAG_CANCEL_NO_TARGET,
+ GDK_DRAG_CANCEL_USER_CANCELLED,
+ GDK_DRAG_CANCEL_ERROR
+} GdkDragCancelReason;
+
/**
* GdkDragProtocol:
* @GDK_DRAG_PROTO_NONE: no protocol.
GdkDragAction actions);
void (*set_cursor) (GdkDragContext *context,
GdkCursor *cursor);
- void (*cancel) (GdkDragContext *context);
+ void (*cancel) (GdkDragContext *context,
+ GdkDragCancelReason reason);
void (*drop_performed) (GdkDragContext *context,
guint32 time);
void (*dnd_finished) (GdkDragContext *context);
void gdk_drag_context_set_cursor (GdkDragContext *context,
GdkCursor *cursor);
-void gdk_drag_context_cancel (GdkDragContext *context);
+void gdk_drag_context_cancel (GdkDragContext *context,
+ GdkDragCancelReason reason);
gboolean gdk_drag_context_handle_source_event (GdkEvent *event);
GdkCursor * gdk_drag_get_cursor (GdkDragAction action);
}
static void
-gdk_wayland_drag_context_cancel (GdkDragContext *context)
+gdk_wayland_drag_context_cancel (GdkDragContext *context,
+ GdkDragCancelReason reason)
{
gdk_drag_context_set_cursor (context, NULL);
}
context = gdk_wayland_drag_context_lookup_by_data_source (source);
if (context)
- gdk_drag_context_cancel (context);
+ gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_ERROR);
gdk_selection_owner_set (NULL, atom, GDK_CURRENT_TIME, TRUE);
gdk_wayland_selection_unset_data_source (display, atom);
GdkDragAction actions);
static void gdk_x11_drag_context_set_cursor (GdkDragContext *context,
GdkCursor *cursor);
-static void gdk_x11_drag_context_cancel (GdkDragContext *context);
+static void gdk_x11_drag_context_cancel (GdkDragContext *context,
+ GdkDragCancelReason reason);
static void gdk_x11_drag_context_drop_performed (GdkDragContext *context,
guint32 time);
}
static void
-gdk_x11_drag_context_cancel (GdkDragContext *context)
+gdk_x11_drag_context_cancel (GdkDragContext *context,
+ GdkDragCancelReason reason)
{
drag_context_ungrab (context);
gdk_drag_drop_done (context, FALSE);
switch (event->keyval)
{
case GDK_KEY_Escape:
- gdk_drag_context_cancel (context);
+ gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_USER_CANCELLED);
return TRUE;
case GDK_KEY_space:
gdk_event_get_time ((GdkEvent *) event));
}
else
- gdk_drag_context_cancel (context);
+ gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_NO_TARGET);
return TRUE;
event->grab_window == x11_context->ipc_window)
return FALSE;
- gdk_drag_context_cancel (context);
+ gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_ERROR);
return TRUE;
}
gdk_event_get_time ((GdkEvent *) event));
}
else
- gdk_drag_context_cancel (context);
+ gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_NO_TARGET);
return TRUE;
}
static void gtk_drag_context_drop_performed_cb (GdkDragContext *context,
guint time,
GtkDragSourceInfo *info);
-static void gtk_drag_context_cancel_cb (GdkDragContext *context,
- GtkDragSourceInfo *info);
+static void gtk_drag_context_cancel_cb (GdkDragContext *context,
+ GdkDragCancelReason reason,
+ GtkDragSourceInfo *info);
static void gtk_drag_context_action_cb (GdkDragContext *context,
GdkDragAction action,
GtkDragSourceInfo *info);
}
static void
-gtk_drag_context_cancel_cb (GdkDragContext *context,
- GtkDragSourceInfo *info)
+gtk_drag_context_cancel_cb (GdkDragContext *context,
+ GdkDragCancelReason reason,
+ GtkDragSourceInfo *info)
{
- gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_ERROR, GDK_CURRENT_TIME);
+ GtkDragResult result;
+
+ switch (reason)
+ {
+ case GDK_DRAG_CANCEL_NO_TARGET:
+ result = GTK_DRAG_RESULT_NO_TARGET;
+ break;
+ case GDK_DRAG_CANCEL_USER_CANCELLED:
+ result = GTK_DRAG_RESULT_USER_CANCELLED;
+ break;
+ case GDK_DRAG_CANCEL_ERROR:
+ default:
+ result = GTK_DRAG_RESULT_ERROR;
+ break;
+ }
+ gtk_drag_cancel_internal (info, result, GDK_CURRENT_TIME);
}
static void